package org.example.controller;


import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.example.common.result.PageResult;
import org.example.common.result.Result;
import org.example.common.utils.PageResultUtils;
import org.example.common.utils.SaTokenUtils;
import org.example.common.utils.TenantContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 示例控制器 - 展示如何使用Result和PageResult
 */
@RestController
@RequestMapping("/api/example")
@Tag(name = "示例接口", description = "系统示例相关接口")
@SecurityRequirement(name = "authorizationBearerAuth")
public class ExampleController {

    @Autowired
    private SaTokenUtils saTokenUtils;

    /**
     * 返回成功结果（无数据）
     */
    @GetMapping("/success")
    public Result<Void> success() {
        return Result.success();
    }

    /**
     * 返回成功结果（有数据）
     */
    @GetMapping("/data")
    public Result<String> getData() {
        return Result.success("Hello World");
    }

    /**
     * 返回错误结果
     */
    @GetMapping("/error")
    public Result<Void> error() {
        return Result.error("这是一个错误示例");
    }

    /**
     * 返回分页结果
     */
    @GetMapping("/page")
    public Result<PageResult<String>> getPageData(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size) {

        // 模拟数据
        List<String> allData = Arrays.asList(
            "数据1", "数据2", "数据3", "数据4", "数据5",
            "数据6", "数据7", "数据8", "数据9", "数据10",
            "数据11", "数据12", "数据13", "数据14", "数据15"
        );

        // 使用工具类创建分页结果
        PageResult<String> pageResult = PageResultUtils.of(current, size, (long) allData.size(), allData);

        return Result.success(pageResult);
    }

    /**
     * 返回空的分页结果
     */
    @GetMapping("/empty-page")
    public Result<PageResult<String>> getEmptyPage(
            @RequestParam(defaultValue = "1") Long current,
            @RequestParam(defaultValue = "10") Long size) {

        PageResult<String> pageResult = PageResult.empty(current, size);
        return Result.success(pageResult);
    }

    /**
     * 返回不同的HTTP状态码
     */
    @GetMapping("/status/{code}")
    public Result<Void> getStatus(@PathVariable Integer code) {
        switch (code) {
            case 400:
                return Result.badRequest("参数错误");
            case 401:
                return Result.unauthorized("未授权访问");
            case 403:
                return Result.forbidden("禁止访问");
            case 404:
                return Result.notFound("资源不存在");
            case 500:
                return Result.error("服务器内部错误");
            default:
                return Result.error(code, "自定义错误码");
        }
    }

    /**
     * 测试 Sa-Token 是否正常工作
     */
    @GetMapping("/sa-token")
    public Result<Map<String, Object>> testSaToken() {
        Map<String, Object> data = new HashMap<>();
        
        // 检查登录状态
        boolean isLogin = saTokenUtils.isLogin();
        data.put("isLogin", isLogin);
        
        if (isLogin) {
            data.put("userId", saTokenUtils.getCurrentUserId());
            data.put("userType", saTokenUtils.getCurrentUserType());
            // 从租户上下文获取companyId（多端隔离）
            data.put("companyId", TenantContext.getCurrentCompanyId());
            data.put("phone", saTokenUtils.getCurrentUserPhone());
            data.put("token", saTokenUtils.getTokenValue());
        }
        
        return Result.success("Sa-Token 测试", data);
    }

    /**
     * 测试 Sa-Token 的 token 读取情况
     */
    @GetMapping("/sa-token-debug")
    public Result<Map<String, Object>> testSaTokenDebug(HttpServletRequest request) {
        Map<String, Object> data = new HashMap<>();
        
        // 获取请求头信息
        String authHeader = request.getHeader("Authorization");
        data.put("authHeader", authHeader);
        
        // 获取所有请求头
        Map<String, String> headers = new HashMap<>();
        java.util.Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String name = headerNames.nextElement();
            headers.put(name, request.getHeader(name));
        }
        data.put("allHeaders", headers);
        
        // Sa-Token 状态
        boolean isLogin = saTokenUtils.isLogin();
        data.put("isLogin", isLogin);
        if (isLogin) {
            data.put("userId", saTokenUtils.getCurrentUserId());
            data.put("userType", saTokenUtils.getCurrentUserType());
            data.put("token", saTokenUtils.getTokenValue());
        }
        
        return Result.success("Sa-Token Debug 信息", data);
    }
}
